#!/bin/bash
# AIDevFlow 初始化脚本
# 作用：搭建项目基础结构、写入 rules.env、安装 Git 标准/钩子，并在“配套模式”下可选触发框架演进。
# 选项：
#   --env=java|python|nodejs        单语言初始化（默认 java）
#   --langs=java,python             多语言初始化（覆盖 --env）
#   --style=mimic|ddd|mvc           架构/风格（默认 mimic，按语言映射）
#   --user=dev|prod                 用户类型（控制调试/严格模式）
#   --project=IFASystem             项目名称（默认取根目录名）
#   --evolve=verify|apply           初始化后触发框架演进（项目侧 ↔ 框架侧）
#   --sync=verify|apply             evolve 的同义参数（别名）；用于触发镜像同步
#   --framework-mode=submodule|subtree|vendor|ignored  设置框架使用模式（调用 setup-framework-mode.sh）
#   --mode-remote=<url>             框架模式的上游仓库地址
#   --mode-branch=<name>            框架模式使用的上游分支（默认 main）
#   --interactive                   强制交互式执行（在 TTY 下默认交互）
#   --non-interactive               关闭交互提示（适合 AI/CI 无人值守）
#   --no-config / --write-config    与演进脚本配套的 No-Config 策略（如启用 no-config，则不写入/同步 config/）
# 用法示例：
#   bash scripts/custom_init.sh --langs=java,python --style=mimic --user=dev --evolve=verify
#   bash scripts/custom_init.sh --env=java --style=ddd --user=prod --evolve=apply --no-config
#   bash scripts/custom_init.sh --interactive --framework-mode=ignored --evolve=apply --no-config

set -eo pipefail

# 路径解析
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
AID_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$AID_DIR")"

# 可选配置加载：尽早加载以便使用 MIRROR_DIR_NAME 等环境键
CONFIG_ENV="$AID_DIR/config/rules.env"
if [[ -f "$CONFIG_ENV" ]]; then
  # shellcheck disable=SC1090
  source "$CONFIG_ENV" || true
fi

# 镜像目录名称仅从配置/环境获取，不设默认值
MIRROR_DIR_NAME="${MIRROR_DIR_NAME:-}"
MIRROR_DIR=""
if [[ -n "$MIRROR_DIR_NAME" ]] && [[ -d "$ROOT_DIR/$MIRROR_DIR_NAME" ]]; then
  MIRROR_DIR="$ROOT_DIR/$MIRROR_DIR_NAME"
fi

# 模板根目录：优先使用已配置的镜像目录模板，其次回退到本仓 AIDevFlow
TEMPLATE_BASE="$AID_DIR/templates"
if [[ -n "$MIRROR_DIR" ]] && [[ -d "$MIRROR_DIR/templates" ]]; then
  TEMPLATE_BASE="$MIRROR_DIR/templates"
fi

# 框架配套状态：如果已配置且存在镜像目录，则视为配套使用
FRAMEWORK_STATUS="none"
if [[ -n "$MIRROR_DIR" ]]; then
  FRAMEWORK_STATUS="paired"
fi
echo "FRAMEWORK_STATUS=$FRAMEWORK_STATUS" >> "$AID_DIR/config/rules.env"

# 可选演进/同步与模式参数
EVOLVE_ARG=""
FRAMEWORK_MODE=""
MODE_REMOTE=""
MODE_BRANCH=""
INTERACTIVE=true
NO_CONFIG=false
WRITE_CONFIG=false
DO_INIT=true

for i in "$@"; do
  case $i in
    --evolve=*)
      EVOLVE_ARG="${i#*=}"
      shift
      ;;
    --sync=*)
      EVOLVE_ARG="${i#*=}"
      shift
      ;;
    --framework-mode=*)
      FRAMEWORK_MODE="${i#*=}"
      shift
      ;;
    --mode-remote=*)
      MODE_REMOTE="${i#*=}"
      shift
      ;;
    --mode-branch=*)
      MODE_BRANCH="${i#*=}"
      shift
      ;;
    --interactive)
      INTERACTIVE=true
      shift
      ;;
    --non-interactive)
      INTERACTIVE=false
      shift
      ;;
    --no-config|--no_config)
      NO_CONFIG=true
      shift
      ;;
    --write-config|--write_config)
      WRITE_CONFIG=true
      shift
      ;;
  esac
done

# 解析参数
for i in "$@"; do
  case $i in
    --env=*)
      ENV_TYPE="${i#*=}"
      shift
      ;;
    --langs=*)
      LANGS_RAW="${i#*=}"
      shift
      ;;
    --style=*)
      STYLE="${i#*=}"
      shift
      ;;
    --user=*)
      USER_TYPE="${i#*=}"
      shift
      ;;
    --project=*)
      PROJECT_NAME="${i#*=}"
      shift
      ;;
    *)
      # 未知选项
      ;;
  esac
done

# 默认值
ENV_TYPE=${ENV_TYPE:-java}
STYLE=${STYLE:-mimic}  # 默认使用 AI 模仿风格 (mimic)，如果未指定
USER_TYPE=${USER_TYPE:-dev}
PROJECT_NAME=${PROJECT_NAME:-$(basename "$ROOT_DIR")}

# 语言集合（优先使用 --langs，其次回退到 --env 单一语言）
if [ -n "${LANGS_RAW:-}" ]; then
  IFS=',' read -r -a LANGS <<< "$LANGS_RAW"
else
  LANGS=("$ENV_TYPE")
fi

echo "初始化 AIDevFlow：项目=$PROJECT_NAME，语言=${LANGS[*]}，风格=$STYLE，用户类型=$USER_TYPE"

# 若非交互式终端，自动关闭交互
if [[ ! -t 0 ]]; then
  INTERACTIVE=false
fi

# 交互式：选择“初始化”或“仅设置参数/动作”
if $INTERACTIVE; then
  echo
  echo "请选择执行模式："
  echo "  [1] 初始化"
  echo "  [2] 仅设置参数/动作（跳过初始化）"
  read -r -p "输入选项数字并回车 [1/2]: " choice_init
  if [[ "$choice_init" == "2" ]]; then
    DO_INIT=false
  fi
fi

if $DO_INIT; then
  # 语言与模板初始化
  for lang in "${LANGS[@]}"; do
    case "$lang" in
      python)
        echo "设置 Python 环境..."
        mkdir -p "$ROOT_DIR/src/main/python"
        # 默认依赖文件（可按需扩展）
        touch "$ROOT_DIR/requirements.txt"
        ;;
      java)
        echo "设置 Java 环境..."
        mkdir -p "$ROOT_DIR/src/main/java"
        ;;
      node|nodejs|javascript|js)
        echo "设置 Node.js 环境..."
        mkdir -p "$ROOT_DIR/src/node"
        ;;
      *)
        echo "警告：暂不支持的语言: $lang（跳过语言级模板复制）"
        ;;
    esac
  done

# 风格特定逻辑（对每种语言应用对应风格；如未指定，按语言默认映射）
# 默认风格映射：java→ddd，python→mimic，node→mvc
default_style_for_lang() {
  case "$1" in
    java) echo ddd;;
    python) echo mimic;;
    node|nodejs|javascript|js) echo mvc;;
    *) echo mimic;;
  esac
}

  for lang in "${LANGS[@]}"; do
    # 选择风格：统一风格或按语言默认
    lang_style="$STYLE"
    if [ -z "$STYLE" ] || [ "$STYLE" = "mimic" ]; then
      # mimic 作为全局默认或未指定时，按语言默认
      lang_style="$(default_style_for_lang "$lang")"
    fi

    echo "为语言 $lang 应用风格: $lang_style"
    case "$lang" in
      java)
        case "$lang_style" in
          mimic)
            echo "Java mimic：检测并沿用现有 src/main/java 结构（不强制重构）。"
            if [ ! -d "$ROOT_DIR/src/main/java" ]; then
              mkdir -p "$ROOT_DIR/src/main/java"
              echo "// Basic Java class" > "$ROOT_DIR/src/main/java/BasicClass.java"
            fi
            ;;
          ddd)
            echo "Java DDD：复制 DDD 模板到 src/main/java (源: $TEMPLATE_BASE/java)"
            cp -r "$TEMPLATE_BASE/java/"* "$ROOT_DIR/src/main/java/" 2>/dev/null || true
            ;;
          mvc)
            echo "Java MVC：复制 MVC 模板到 src/main/java (源: $TEMPLATE_BASE/mvc)"
            cp -r "$TEMPLATE_BASE/mvc/"* "$ROOT_DIR/src/main/java/" 2>/dev/null || true
            ;;
          *)
            echo "不支持的 Java 风格: $lang_style"; exit 1;;
        esac
        ;;
      python)
        case "$lang_style" in
          mimic)
            echo "Python mimic：若存在 src/main/python 则沿用结构；否则创建基础入口。"
            if [ ! -d "$ROOT_DIR/src/main/python" ]; then
              mkdir -p "$ROOT_DIR/src/main/python"
              echo "# Basic Python app" > "$ROOT_DIR/src/main/python/app.py"
              grep -q "flask" "$ROOT_DIR/requirements.txt" 2>/dev/null || echo "flask" >> "$ROOT_DIR/requirements.txt"
            fi
            ;;
          ddd)
            echo "Python DDD：复制 DDD 模板到 src/main/python (源: $TEMPLATE_BASE/python/ddd)"
            mkdir -p "$ROOT_DIR/src/main/python"
            cp -r "$TEMPLATE_BASE/python/ddd/"* "$ROOT_DIR/src/main/python/" 2>/dev/null || true
            ;;
          mvc)
            echo "Python MVC：复制 MVC 模板到 src/main/python (源: $TEMPLATE_BASE/python/mvc)"
            mkdir -p "$ROOT_DIR/src/main/python"
            cp -r "$TEMPLATE_BASE/python/mvc/"* "$ROOT_DIR/src/main/python/" 2>/dev/null || true
            ;;
          *)
            echo "不支持的 Python 风格: $lang_style"; exit 1;;
        esac
        ;;
      node|nodejs|javascript|js)
        case "$lang_style" in
          mimic)
            echo "Node mimic：创建基础入口（index.js）或沿用现有结构。"
            if [ ! -d "$ROOT_DIR/src/node" ]; then
              mkdir -p "$ROOT_DIR/src/node"
              echo "console.log('Hello Node')" > "$ROOT_DIR/src/node/index.js"
            fi
            ;;
          mvc)
            echo "Node MVC：暂未提供模板，mimic 回退。"
            ;;
          ddd)
            echo "Node DDD：暂未提供模板，mimic 回退。"
            ;;
        esac
        ;;
      *) ;;
    esac
  done

# 用户类型特定逻辑
  if [ "$USER_TYPE" = "dev" ]; then
    echo "添加开发配置..."
    if [[ "$NO_CONFIG" != "true" ]]; then echo "DEBUG=true" >> "$AID_DIR/config/rules.env"; fi
  elif [ "$USER_TYPE" = "prod" ]; then
    echo "添加生产配置..."
    if [[ "$NO_CONFIG" != "true" ]]; then echo "STRICT_MODE=true" >> "$AID_DIR/config/rules.env"; fi
  fi

# 运行标准初始化
  bash "$AID_DIR/scripts/setup-git-standards.sh" || true
  bash "$AID_DIR/scripts/install-git-hooks.sh" || true
  bash "$AID_DIR/scripts/pre-commit-check.sh" || true

  # 修改 .gitignore 以排除已配置的镜像目录（不依赖固定名称）
  if [[ -n "$MIRROR_DIR_NAME" ]]; then
    MIRROR_NAME="$MIRROR_DIR_NAME/"
    echo "更新 .gitignore 以排除 $MIRROR_NAME..."
    if ! grep -q "^$MIRROR_NAME$" "$ROOT_DIR/.gitignore" 2>/dev/null; then
      echo "$MIRROR_NAME" >> "$ROOT_DIR/.gitignore"
      echo "已将 $MIRROR_NAME 添加到 .gitignore"
    else
      echo "$MIRROR_NAME 已在 .gitignore 中"
    fi
  fi

# 数据库初始化（基于用户规则）
  echo "初始化数据库配置..."
  if [[ "$WRITE_CONFIG" == "true" && "$NO_CONFIG" != "true" ]]; then
    echo "DATABASE=is2" >> "$AID_DIR/config/rules.env"
    echo "DB_USER=root" >> "$AID_DIR/config/rules.env"
    echo "DB_PASSWORD=danbaifen" >> "$AID_DIR/config/rules.env"
  else
    echo "(跳过写入 DATABASE/DB_*，需使用 --write-config 才写入)"
  fi

# 项目信息与风格映射写入（贯穿规则）
  echo "PROJECT_NAME=$PROJECT_NAME" >> "$AID_DIR/config/rules.env"
  echo "LANGUAGES=${LANGS[*]}" >> "$AID_DIR/config/rules.env"

# 总体架构风格（以首个语言风格为主）
PRIMARY_LANG="${LANGS[0]}"
PRIMARY_STYLE="$STYLE"
if [ -z "$PRIMARY_STYLE" ] || [ "$PRIMARY_STYLE" = "mimic" ]; then
  PRIMARY_STYLE="$(default_style_for_lang "$PRIMARY_LANG")"
fi
  echo "ARCHITECTURE_STYLE=$PRIMARY_STYLE" >> "$AID_DIR/config/rules.env"

# 每语言风格写入
  for lang in "${LANGS[@]}"; do
    lang_key="$(echo "$lang" | tr '[:lower:]' '[:upper:]')"
    lang_style="$STYLE"
    if [ -z "$lang_style" ] || [ "$lang_style" = "mimic" ]; then
      lang_style="$(default_style_for_lang "$lang")"
    fi
    echo "STYLE_${lang_key}=$lang_style" >> "$AID_DIR/config/rules.env"
  done
fi

# 确保 Trae IDE 入口规则文件存在（仅在缺失时创建，不覆盖用户改动）
ensure_trae_rules_entry() {
  local TRAE_DIR="$ROOT_DIR/.trae/rules"
  local TARGET="$TRAE_DIR/project_rules.md"
  local FRAMEWORK_DIR_NAME_COMPUTED="${FRAMEWORK_DIR_NAME:-$(basename "$AID_DIR") }"
  local FW_REL="../../${FRAMEWORK_DIR_NAME_COMPUTED}"
  mkdir -p "$TRAE_DIR"
  if [[ ! -f "$TARGET" ]]; then
    cat > "$TARGET" <<EOF
# ${PROJECT_NAME:-项目} 项目规则总览（Trae 入口保留）

本文件为 Trae IDE 的规则入口。AIDevFlow 独立分发副本位于 `${FW_REL}/rules/project_rules.md`，两者应保持内容同步。

为确保 IDE 内规则链接与工具脚本正常工作：
- 若在 AIDevFlow 中更新规则，请同步更新此文件或在 PR 中标注需要同步
- 规则主合约与索引参考：
  - `${FW_REL}/rules/ai_rules_and_prompts.md`
  - `${FW_REL}/docs/meta_index.md`

完整规则内容请访问 `${FW_REL}/rules/project_rules.md`。

---

## AIDevFlow 框架引用（Trae 入口补充）
- 本项目已接入 AIDevFlow（演进/框架镜像策略）。
- 入口文档：
  - `${FW_REL}/rules/framework_info.md`（框架信息与演进说明）
  - `${FW_REL}/rules/project_rules.md`（项目规则总览，需与本文件保持同步）
- 常用脚本：
  - 框架侧初始化：`bash ${FRAMEWORK_DIR_NAME_COMPUTED}/scripts/custom_init.sh --langs=java,python --style=mimic`
  - 框架演进（项目侧）：`bash ${FRAMEWORK_DIR_NAME_COMPUTED}/scripts/framework_evolve.sh verify|apply`

## 常见 AIIDE 初始化指引
- Trae IDE：当前入口文件即 `.trae/rules/project_rules.md`，建议保留并同步更新；如需追加框架说明，可参见上方“框架引用”。
- Cursor / VS Code：可在项目根 `README.md` 或 `docs/` 中加入“框架说明”与“初始化命令”章节，指向 `${FW_REL}/rules/framework_info.md` 与脚本入口；同时在各 IDE 的设置/扩展说明处参考此文档。
- 统一建议：将“初始命令”和“演进命令”作为 README 顶部快速入口，便于 IDE/AI 助手读取并遵循框架规则。

---

## 文档与注释要求（新增）
- 当创建脚本文件或其他复杂文件时，必须添加文档说明或在脚本/源代码内添加清晰的头部注释（用途、参数/选项、示例、注意事项）。
- 对已有复杂脚本进行优化或变更时，需同步完善注释与相应文档。
  - 相关参考：`${FW_REL}/rules/framework_info.md`（verify/apply 语义与提交规范）。

## 框架修改记录（新增）
- 当对框架进行修改/优化时，在框架侧添加 `docs/framework_changes.md` 文件，记录：动机、改动、影响、验证方式及关联信息。
- 目的：便于他人审阅与提出改进建议，支持在无大型 Git 合并的场景下进行信息同步与演进协作。
  - 索引：在 `${FW_REL}/docs/meta_index.md` 中加入该记录文件条目，保证可发现性。
EOF
    echo "已创建 Trae IDE 入口规则文件：$TARGET"
  else
    echo "Trae IDE 入口规则文件已存在：$TARGET（跳过自动覆盖）"
  fi
}

# 执行 IDE 入口保障
ensure_trae_rules_entry

# 交互式：如未指定模式，提示选择模式
if $INTERACTIVE && [[ -z "$FRAMEWORK_MODE" ]]; then
  echo
  echo "是否设置框架使用模式？"
  echo "  [1] submodule"
  echo "  [2] subtree"
  echo "  [3] vendor"
  echo "  [4] ignored"
  echo "  [0] 跳过"
  read -r -p "输入选项数字并回车 [1-4/0]: " choice_mode
  case "$choice_mode" in
    1) FRAMEWORK_MODE="submodule";;
    2) FRAMEWORK_MODE="subtree";;
    3) FRAMEWORK_MODE="vendor";;
    4) FRAMEWORK_MODE="ignored";;
    *) FRAMEWORK_MODE="";;
  esac
fi

# 应用框架模式配置（如提供或在交互中选择）
if [[ -n "$FRAMEWORK_MODE" ]]; then
  echo "应用框架模式：$FRAMEWORK_MODE"
  MODE_ARGS=("--mode=$FRAMEWORK_MODE")
  [[ -n "$MODE_REMOTE" ]] && MODE_ARGS+=("--remote=$MODE_REMOTE")
  [[ -n "$MODE_BRANCH" ]] && MODE_ARGS+=("--branch=$MODE_BRANCH")
  bash "$AID_DIR/scripts/setup-framework-mode.sh" "${MODE_ARGS[@]}"
  # 将模式写入 rules.env（若模式脚本未写入则由此兜底）
  RULES_ENV="$AID_DIR/config/rules.env"
  mkdir -p "$AID_DIR/config"
  if grep -q "^FRAMEWORK_DISTRIBUTION_MODE=" "$RULES_ENV" 2>/dev/null; then
    sed -i.bak -E "s/^FRAMEWORK_DISTRIBUTION_MODE=.*/FRAMEWORK_DISTRIBUTION_MODE=$FRAMEWORK_MODE/" "$RULES_ENV"
  else
    echo "FRAMEWORK_DISTRIBUTION_MODE=$FRAMEWORK_MODE" >> "$RULES_ENV"
  fi
fi

# 交互式：如未指定 evolve/sync，提示是否同步到镜像
if $INTERACTIVE && [[ -z "$EVOLVE_ARG" ]]; then
  echo
  echo "是否触发框架演进到已配置的镜像目录？"
  echo "  [1] verify（干跑）"
  echo "  [2] apply（应用同步）"
  echo "  [0] 跳过"
  read -r -p "输入选项数字并回车 [1/2/0]: " choice_sync
  case "$choice_sync" in
    1) EVOLVE_ARG="verify";;
    2) EVOLVE_ARG="apply";;
    *) EVOLVE_ARG="";;
  esac
fi

# 执行演进（项目侧 ↔ 框架侧）
if [[ -n "$EVOLVE_ARG" ]]; then
  echo "触发框架演进：$EVOLVE_ARG ${NO_CONFIG:+(no-config)}"
  EXTRA_ARGS=()
  $NO_CONFIG && EXTRA_ARGS+=("--no-config")
  bash "$AID_DIR/scripts/framework_evolve.sh" "$EVOLVE_ARG" "${EXTRA_ARGS[@]}"
fi

# 渲染规则以应用风格（文档占位符展开）
bash "$AID_DIR/scripts/render-rules.sh" || true

# 输出初始化完成信息；如需框架演进可手动运行演进脚本
if [[ "$FRAMEWORK_STATUS" == "paired" ]]; then
echo "初始化完成（配套模式）。可选：执行框架演进（verify/apply）：bash scripts/framework_evolve.sh verify|apply"
else
  echo "初始化完成（单仓模式）。"
fi
